package com.rainbow.common.core.toolkit;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.rainbow.common.core.constant.Constant;
import org.apache.commons.collections4.MapUtils;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * threadLocal工具类
 * 采用阿里巴巴的threadLocal
 * 跨线程池传递参数
 * @author 付为地
 */
public class ContextHolder {

    private static final ContextHolder INSTANCE = new ContextHolder();

    private ContextHolder() {
    }

    public static ContextHolder getInstance() {
        return INSTANCE;
    }

    /**
     * TransmittableThreadLocal使用
     */
    private TransmittableThreadLocal<Map<String, Object>> fastThreadLocal = new TransmittableThreadLocal<>() {
        @Override
        protected Map<String, Object> initialValue() {
            return new ConcurrentHashMap<>();
        }
    };

    /**
     *存入数据
     * @param key 数据key
     * @param value 数据value
     * @return 存储结果
     */
    public Object put(String key, Object value) {
        return fastThreadLocal.get().put(key, value);
    }

    /**
     * 获取数据
     * @param key 参数key
     * @return 获取结果
     */
    public Object get(String key) {
        return fastThreadLocal.get().get(key);
    }

    /**
     * 返回指定类型结果
     * @param key 参数key
     * @param type 结果类型
     * @param <T> 泛型类型
     * @return 返回转换的结果
     */
    public <T> T get(String key, Class<T> type) {
        return type.cast(fastThreadLocal.get().get(key));
    }

    /**
     * 移除数据
     * @param key 参数key
     * @return 移除结果
     */
    public Object remove(String key) {
        return fastThreadLocal.get().remove(key);
    }

    /**
     * 返回初始MAP
     * @return 返回初始MAP
     */
    public Map<String, Object> entries() {
        return fastThreadLocal.get();
    }

    /**
     * 当前登录人编号
     * @return 返回当前登陆人
     */
    public static String getUserId() {
        JSONObject userObject = ContextHolder.getInstance().get(Constant.CURRENT_LOGIN_USER,JSONObject.class);
        return MapUtils.getString(userObject,Constant.CURRENT_LOGIN_USER_ID);
    }

    /**
     * 当前登录人
     * @return 返回当前登陆人
     */
    public static String getUserName() {
        JSONObject userObject = ContextHolder.getInstance().get(Constant.CURRENT_LOGIN_USER,JSONObject.class);
        return MapUtils.getString(userObject,Constant.CURRENT_LOGIN_USER_NAME);
    }

    /**
     * 用户昵称
     * @return 返回用户昵称
     */
    public static String getNickName() {
        JSONObject userObject = ContextHolder.getInstance().get(Constant.CURRENT_LOGIN_USER,JSONObject.class);
        return MapUtils.getString(userObject,Constant.CURRENT_LOGIN_USER_NICK_NAME);
    }

    /**
     * 用户手机号
     * @return 用户手机号
     */
    public static String getUserPhone() {
        JSONObject userObject = ContextHolder.getInstance().get(Constant.CURRENT_LOGIN_USER,JSONObject.class);
        return MapUtils.getString(userObject,Constant.CURRENT_LOGIN_USER_PHONE);
    }


    /**
     * 用户邮箱
     * @return 用户邮箱
     */
    public static String getUserEmail() {
        JSONObject userObject = ContextHolder.getInstance().get(Constant.CURRENT_LOGIN_USER,JSONObject.class);
        return MapUtils.getString(userObject,Constant.CURRENT_LOGIN_USER_EMAIL);
    }


}
